package top.eggcode.plugins.session.manager;

import top.eggcode.plugins.session.Session;
import top.eggcode.plugins.session.exception.InvalidSessionException;
import top.eggcode.plugins.session.exception.SessionException;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;

/**
 * Title: 会话管理器接口
 * Description: TODO
 * Date: 2021/8/12 15:12
 *
 * @author JiaQi Ding
 * @version 1.0
 */
public interface SessionManager {

    /**
     * 启动新的会话
     * 控制创建的细节
     * 主要用于框架开发，所以通常会传递参数
     *
     * @return
     */
    Session start();

    /**
     * 检索会话，根据指定的上下文数据，如会话 ID
     * 如果找不到会话将会抛出异常。
     *
     * @param key
     * @return
     * @throws SessionException
     */
    Session getSession(Serializable key) throws SessionException;

    /**
     * 获取会话创建时间
     *
     * @param key
     * @return
     */
    Date getStartTimestamp(Serializable key);

    /**
     * 获取用户最后一次访问时间
     * 在请求过滤器中更新时间
     *
     * @param key
     * @return
     */
    Date getLastAccessTime(Serializable key);

    /**
     * 会话是否有效
     *
     * @param key
     * @return
     */
    boolean isValid(Serializable key);

    /**
     * 如果关联的会话有效（该会话存在且未停止或过期），则正常返回；否则抛出异常
     *
     * @param key
     * @throws InvalidSessionException
     */
    void checkValid(Serializable key) throws InvalidSessionException;

    /**
     * 返回会话可继续存活的时长
     *
     * @param key
     * @return
     * @throws InvalidSessionException
     */
    long getTimeout(Serializable key) throws InvalidSessionException;

    /**
     * 设置存活时长
     *
     * @param key
     * @param maxIdleTimeInMillis
     * @throws InvalidSessionException
     */
    void setTimeout(Serializable key, long maxIdleTimeInMillis) throws InvalidSessionException;

    /**
     * 更新上次访问时间
     *
     * @param key
     * @throws InvalidSessionException
     */
    void touch(Serializable key) throws InvalidSessionException;


    /**
     * 获取主体的网络主机
     *
     * @param key
     * @return
     */
    String getHost(Serializable key);


    /**
     * 结束会话
     *
     * @param key
     * @throws InvalidSessionException
     */
    void stop(Serializable key) throws InvalidSessionException;


    /**
     * 获取会话数据的所有key
     *
     * @param String
     * @return
     */
    Collection<Object> getAttributeKeys(Serializable sessionKey);


    Object getAttribute(Serializable sessionKey, Object attributeKey) throws InvalidSessionException;


    void setAttribute(Serializable sessionKey, Object attributeKey, Object value) throws InvalidSessionException;

    Object removeAttribute(Serializable sessionKey, Object attributeKey) throws InvalidSessionException;


}
